
#include "FileUtils.hxx"
#include "NormalImageMerger.hxx"

NormalImageMerger::NormalImageMerger()
{
    // _sourceDir[0]='\0';
    // _destFileName[256]='\0';
}

// bool NormalImageMerger::createTargetImage()
// {
//     std::vector<std::string> files;

//     ListFiles(this->_sourceDir,_fileSuffix, files);

//     if( files.size() <  1 )
//         return false;

//     int maxRowIdx = 0; 
//     int maxColIdx = 0;

//     char filePath[256];
//     char *fileName = 0;

//     char formatString[256];
//     sprintf(formatString, "Tile_R%%d_C%%d.%s", _fileSuffix);

//     for(int i = 0; i < files.size(); i ++)
//     {
//         int rowIdx = 0;
//         int colIdx = 0;

//         memset(filePath,0,256);

//         strncpy(filePath,files.at(i).c_str(),files.at(i).size());

//         fileName = strstr(filePath, "Tile");

//         sscanf(fileName,formatString, &rowIdx, &colIdx);

//         if( rowIdx > maxRowIdx ) maxRowIdx = rowIdx;
//         if( colIdx > maxColIdx ) maxColIdx = colIdx;
//     }

//     //_targetImage = cv::Mat::zeros((maxRowIdx + 1) * 1024, (maxColIdx + 1) * 1024, CV_8UC3);
//     _targetImage = cv::Mat((maxRowIdx + 1) * 1024, (maxColIdx + 1) * 1024, CV_8UC3, cv::Scalar(255,255,255));
//     return _targetImage.rows > 0;
// }

bool NormalImageMerger::mergeTileFiles()
{

    bool ret = createTargetImage();

    if( !ret ) return ret;
 
    std::vector<std::string> files;

    ListFiles(this->_sourceDir,_fileSuffix, files);

    if( files.size() <  1 )
        return false;

    char filePath[256];
    char *fileName = 0;

    char formatString[256];
    sprintf(formatString, "Tile_R%%d_C%%d.%s", _fileSuffix);

    for(int i = 0; i < files.size(); i ++)
    {
        int rowIdx = 0;
        int colIdx = 0;

        memset(filePath,0,256);

        strncpy(filePath,files.at(i).c_str(),files.at(i).size());

        fileName = strstr(filePath, "Tile");

        sscanf(fileName, formatString, &rowIdx, &colIdx);

        printf("%s\n", fileName);

        cv::Mat tile = cv::imread(filePath, cv::IMREAD_COLOR);
        
        cv::Mat mask = _targetImage(cv::Rect(colIdx * 1024, rowIdx * 1024, 1024, 1024));

        tile.copyTo(mask);
    }

    // Write file to a Huge Image;
    cv::imwrite(_destFileName,_targetImage);

    return true;
}
